package com.xz.example;

import com.xz.example.model.EagerSingleton;
import com.xz.example.model.LazySubgletion;
import com.xz.example.model.LoadBalance;

/**
 * @author 张志航     
 * @version V1.0.0
 * @projectName design_mode
 * @title     Client   
 * @package    com.xz.example  
 * @date   2019/12/3 14:22  
 * @explain
 */
public class Client {

    /**
     * 需求：
     *      某公司承接了一个负载均衡（Load Balance）器软件的开发工作，该软件运行在一台负载均衡服务器上，可以将并发访问和数据流量分发到服务器集群中的
     *      多台设备上进行并发处理，提高系统的整体处理能力，缩短响应时间。由于集群中的服务器需要动态的删减，且客户端请求需要统一分发，因此需要确保
     *      负载均衡器的唯一性，试用单例模式设计该负载均衡器。
     * 分析：
     *      单例的负载均衡器中需要包含一个容器，用来存储服务器，客户可以动态的添加或者删除服务器，并且可以获取服务器（分发）；
     * @param args
     */
    public static void main(String[] args) {

        method1();

        // 饿汉式，在类加载时就直接创建对象
        //method2();

        // 懒汉式，又被称为延迟加载，在第一次调用获取实例的方法时才会实例化（案例中的方式属于懒汉式）
        //method3();
    }

    public static void method3() {
        LazySubgletion instance = LazySubgletion.getInstance();
        LazySubgletion instance1 = LazySubgletion.getInstance();
        System.out.println(instance ==instance1);
    }

    public static void method2() {
        EagerSingleton instance = EagerSingleton.getInstance();
        EagerSingleton instance1 = EagerSingleton.getInstance();
        System.out.println(instance == instance1);
    }

    public static void method1() {
        LoadBalance loadBalance1 = LoadBalance.getLoadBalance();
        LoadBalance loadBalance2 = LoadBalance.getLoadBalance();
        LoadBalance loadBalance3 = LoadBalance.getLoadBalance();
        if (loadBalance1 == loadBalance2 && loadBalance2== loadBalance3 && loadBalance1 == loadBalance3){
            System.out.println("负载均衡器是唯一的！！");
        }

        loadBalance1.addServer("Server 1");
        loadBalance2.addServer("Server 2");
        loadBalance3.addServer("Server 3");

        LoadBalance loadBalance4 = LoadBalance.getLoadBalance();
        for (int i = 0; i < 10; i++) {
            System.out.println("请求分发到服务器： "+loadBalance4.getServer());
        }
    }

}
